#ifndef GY_BUTTONITEM_H
#define GY_BUTTONITEM_H

#include "GY_ContainerTransform.h"
#include "GY_ControlLibrary_global.h"
#include <QVector>
#include <QPainter>
#include <QPainterPath>
#include "Graphics/BasicGraphics/GY_GraphicsButtonEditItem.h"

class GY_CONTROLLIBRARY_EXPORT GY_ButtonItem : public GY_ContainerTransform
{
    Q_OBJECT
public:
    explicit Q_INVOKABLE GY_ButtonItem(const QString &guid,QGraphicsItem *parent = nullptr);
    ~GY_ButtonItem();
    /**
     * @brief addItem 组中添加图元
     * @param item
     * @return
     */
    virtual bool addItem(GY_Object *pItem) override;
    /**
     * @brief removItem 移除组中的图元
     * @param guid 图元的guid
     * @return 是否移除成功
     */
    virtual bool removItem(const QString &guid) override;
    /**
     * @brief removItem 移除图元
     * @param pItem 图元指针
     * @return 是否移除成功
     */
    virtual bool removItem(const GY_Object *pItem) override;
private:
    /**
     * @brief initializationPropertyInfo 初始化属性信息
     */
    void initializationPropertyInfo();
    /**
     * @brief updatePosition 更新位置
     * @param name 属性名称
     * @param value 位置
     * @return 是否更新成功
     */
    bool updatePosition(const QString &name, const QVariant &value);
    /**
     * @brief updatePoint1 更新点1位置
     * @param name 属性名称
     * @param value 点1位置
     * @return 是否更新成功
     */
    bool updatePoint1(const QString &name, const QVariant &value);
    /**
     * @brief updatePoint2 更新点2位置
     * @param name 属性名称
     * @param value 点2位置
     * @return 是否更新成功
     */
    bool updatePoint2(const QString &name, const QVariant &value);
    /**
     * @brief updatePoint3 更新点3位置
     * @param name 属性名称
     * @param value 点3位置
     * @return 是否更新成功
     */
    bool updatePoint3(const QString &name, const QVariant &value);
    /**
     * @brief updatePoint4 更新点4位置
     * @param name 属性名称
     * @param value 点4位置
     * @return 是否更新成功
     */
    bool updatePoint4(const QString &name, const QVariant &value);
    /**
     * @brief updateCurrentState 更新显示哪个子项目
     * @param name 属性名称
     * @param value 项目编号
     * @return 是否更新成功
     */
    bool updateCurrentState(const QString &name, const QVariant &value);
    /**
     * @brief updateActiveAreaLeft 更新显示左边离中心点距离
     * @param name 属性名称
     * @param value 距离
     * @return 是否更新成功
     */
    bool updateActiveAreaLeft(const QString &name, const QVariant &value);
    /**
     * @brief updateActiveAreaRight 更新显示右边离中心点距离
     * @param name 属性名称
     * @param value 距离
     * @return 是否更新成功
     */
    bool updateActiveAreaRight(const QString &name, const QVariant &value);
    /**
     * @brief updateActiveAreaBottom 更新显示下边离中心点距离
     * @param name 属性名称
     * @param value 距离
     * @return 是否更新成功
     */
    bool updateActiveAreaBottom(const QString &name, const QVariant &value);
    /**
     * @brief updateActiveAreaTop 更新显示上边离中心点距离
     * @param name 属性名称
     * @param value 距离
     * @return 是否更新成功
     */
    bool updateActiveAreaTop(const QString &name, const QVariant &value);
    /**
     * @brief updateIsVisible 更新显示全部项目
     * @param name 属性名称
     * @param value bool值
     * @return 是否更新成功
     */
    bool updateIsVisible(const QString &name, const QVariant &value);
    /**
     * @brief updateNumberOfStates 更新子项目数量
     * @param name 属性名称
     * @param value 子项目数量
     * @return 是否更新成功
     */
    bool updateNumberOfStates(const QString &name, const QVariant &value);
    /**
     * @brief updateShowAllStates 是否显示全部项目
     * @param name 属性名称
     * @param value bool值
     * @return 是否更新成功
     */
    bool updateShowAllStates(const QString &name, const QVariant &value);
    /**
     * @brief showChildrenItem 显示子项目
     * @param index 索引
     */
    void showChildrenItem(const int &index);
    /**
     * @brief removeItem 移除全部图像
     */
    void hideItem(const int &index);
    /**
     * @brief updatePath 更新矩形路径
     */
    void updatePath();
private:
    //点击区域
    GY_GraphicsButtonEditItem* m_pRect;

};


#endif // GY_BUTTONITEM_H
